package de.fhd.pms.ctrl;

import java.util.Date;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import de.fhd.pms.dao.AutomobilDeleteException;
import de.fhd.pms.dao.TeilnehmerDao;
import de.fhd.pms.dao.TeilnehmerDeleteException;
import de.fhd.pms.model.Automobil;
import de.fhd.pms.model.Teilnehmer;

/*
 * Schritt 1: Definition der Klasse als Controller
 */

/**
 * Controller von Teilnehmer.
 * <p>
 * Der TeilnehmerController übernimmt die Ablaufsteuerung für das Handling von
 * Teilnehmern (z. B. Userinput).
 * 
 * @author Martin Schmid
 * @author Florian Schachner
 */
@Controller
public class TeilnehmerController {

	private static Logger log = Logger.getLogger(TeilnehmerController.class);

	// Schritt 2: Definition einer DAO-Instanz vom Typ der Klasse TeilnehmerDao
	private TeilnehmerDao teilnehmerDao = null;

	// Schritt 3: setTeilnehmerDao-Methode:
	// Hier greift das IoC-Prinzip (Hollywood-Prinzip)
	// "Ich erwarte, das mir jemand dieses Objekt mitgibt"

	/**
	 * SetTeilnehmerDao-Methode von TeilnehmerController.
	 * <p>
	 * Hier wird der Input des Benutzers für einen Teilnehmer und für das Model
	 * gemappt.
	 * 
	 * @param teilnehmerDao
	 * @author Martin Schmid
	 * @author Florian Schachner
	 */
	public void setTeilnehmerDao(TeilnehmerDao teilnehmerDao) {
		this.teilnehmerDao = teilnehmerDao;
	}

	// Schritt 4: Definition einer save-Methode, die als Parameter einen
	// Teilnehmer und ein Model übergeben erhält,
	// um mithilfe der zuvor angelegten save-Methode der Dao-Instanz eine Person
	// in der Datenbank abzuspeichern.
	// Durch die Angabe der Annotation @RequestMapping reagiert diese Methode
	// nur auf den Befehl "/EditTeilnehmer.html" per URL-Eingabe.
	// Mit der method=RequestMethod.Get werden die Bestandteile (Parameter) der
	// URL umgewandelt in ein Teilnehmer-Objekt

	/**
	 * Edit-Methode von TeilnehmerController.
	 * <p>
	 * Hierbei wird es ermöglicht, bestehende Teilnehmer abzuändern bzw. zu
	 * editieren. Reagiert auf einen HTTP-Request '/EditTeilnehmer.html'.
	 * 
	 * @param id
	 *            - Integer
	 * @return Gibt ein Objekt vom Typ {@link ModelAndView} ("EditTeilnehmer")
	 *         zurück.
	 * @author Martin Schmid
	 * @author Florian Schachner
	 */
	@RequestMapping(value = "/EditTeilnehmer.html", method = RequestMethod.GET)
	public ModelAndView edit(@RequestParam(required = false) Integer id) {
		log.info("EditTeilnehmer.html");
		ModelAndView mv = new ModelAndView();
		if (id == null) {
			mv.addObject(new Teilnehmer());
		} else {
			mv.addObject(teilnehmerDao.findById(id));
		}

		if (id == null) {
			mv.addObject("title", "Teilnehmer eintragen");
			mv.addObject("message", "Mithilfe dieses Eingabeformulars können neue Teilnehmer am CarSharing-Projekt angemeldet werden.");
		} else {
			mv.addObject("title", "Teilnehmerdaten ändern");
			mv.addObject("message", "Mithilfe dieses Eingabeformulars können die Teilnehmerdaten geändert werden.");
		}

		mv.setViewName("editTeilnehmer");
		return mv;
	}

	/**
	 * Save-Mehtode von TeilnehmerController.
	 * <p>
	 * Hierbei wird ein anzulegender Teilnehmer anhand der Benutzereingaben
	 * gespeichert. Der Input wird an die entsprechende DAO-Instanz
	 * weitergegeben. Reagiert auf einen HTTP-Request '/SaveTeilnehmer.html'.
	 * 
	 * @param teilnehmer
	 *            - Ein Objekt der Klasse {@link Teilnehmer}
	 * @param model
	 * @return Einen Redirect mit dem Befehl 'AlleTeilnehmer.html'
	 * @author Martin Schmid
	 * @author Florian Schachner
	 */
	@RequestMapping(value = "/SaveTeilnehmer.html", method = RequestMethod.POST)
	public String save(Teilnehmer teilnehmer, Model model) {
		log.info("SaveTeilnehmer.html");

		if (teilnehmer.getCreated() == null) {
			teilnehmer.setCreated(new Date());
		}
		Teilnehmer result = teilnehmerDao.save(teilnehmer);
		// set id from create
		if (teilnehmer.getId() == null) {
			teilnehmer.setId(result.getId());
		}
		model.addAttribute("statusMessageKey", "teilnehmer.form.msg.success");
		return "redirect:AlleTeilnehmer.html";
	}

	/**
	 * FindAll-Methode von TeilnehmerController.
	 * <p>
	 * Hierbei wird es ermöglicht, alle angelegten Teilnehmer in der Datenbank
	 * auszulesen. Diese Methode reagiert auf den Befehl '/AlleTeilnehmer.html'.
	 * Sie liefert alle Teilnehmer aus der Datenbank zurück. Alle gefundenen
	 * Teilnehmer werden dem ModelAndView-Objekt hinzugefügt. Abschließend wird
	 * die View mit Namen "listTeilnehmer" aufgerufen.
	 * 
	 * @return Gibt ein Objekt vom Typ {@link ModelAndView} ("listTeilnehmer")
	 *         zurück.
	 * @author Martin Schmid
	 * @author Florian Schachner
	 * */
	@RequestMapping(value = "/AlleTeilnehmer.html", method = RequestMethod.GET)
	public ModelAndView findAll() {
		ModelAndView mv = new ModelAndView();
		mv.addObject("title", "Teilnehmer am CarSharing-Projekt");
		mv.addObject("message", "Alle Teilnehmer des CarSharing-Projekts");
		mv.addObject("teilnehmer", teilnehmerDao.findAll());
		mv.setViewName("listTeilnehmer");
		return mv;
	}

	/**
	 * Delete-Methode von TeilnehmerController.
	 * <p>
	 * Hierbei wird es ermöglicht, bestehende Teilnehmer aus der Datenbank zu
	 * löschen. Diese Methode reagiert auf den Befehl '/LoescheTeilnehmer.html'.
	 * Sie löscht den ausgewählten Teilnehmer aus der Datenbank. Abschließend
	 * wird die View mit Namen "AlleTeilnehmer" aktualisiert bzw. aufgerufen.
	 * 
	 * @param teilnehmer
	 *            - Ein Objekt der Klasse {@link Teilnehmer}
	 * @return Einen Redirect mit dem Befehl 'AlleTeilnehmer.html'
	 * @author Martin Schmid
	 * @author Florian Schachner
	 */
	@RequestMapping(value = "/LoescheTeilnehmer.html", method = RequestMethod.GET)
	public ModelAndView delete(Teilnehmer teilnehmer) {
		log.info("TEILNEHMERCONTROLLER: LoescheTeilnehmer.html");
		
		
		try {
			teilnehmerDao.delete(teilnehmer);
			return new ModelAndView("redirect:AlleTeilnehmer.html");
		} catch (TeilnehmerDeleteException e) {
			ModelAndView mv = new ModelAndView("error");
			mv.addObject("message", e.getMessage());
			return mv;
		}
		
	}

}
